//
//  ViewController.m
//  socket模拟HTTP请求，访问百度
//
//  Created by 罗腾 on 2017/6/28.
//  Copyright © 2017年 gtexpress. All rights reserved.
//

#import "ViewController.h"
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1. 创建Socket
    /**
     第一个参数: 协议域 IPV4, IPV6
     第二个参数: Socket的类型  流式Socket (TCP),SOCK_STREAM 还是 数据报式Socket (UDP)SOCK_DGRAM
     第三个参数: 传输协议 TCP ,UDP , 一半传0, 代表根据第二参数自动选择
     返回值: socket 标识 >0则代表成功
     */
    int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    
    //2. 和服务器建立连接
    /**
     第一个参数: 要连接的客户端Socket
     第二个参数: 服务器地址的结构体
     第三个参数: 服务器地址的长度
     返回值 0 表示连接成功, 其他表示失败
     */
    struct sockaddr_in serverAddress;
    
    
    //赋值IP地址,这里是百度一台服务器的IP地址
    serverAddress.sin_addr.s_addr = inet_addr("119.75.217.109");
    
    
    
    
    //端口号  不同cup 和操作系统 对端口号的存储方式不一样, htons 的作用就是做统一的处理
    serverAddress.sin_port = htons(80);
    int result = connect(clientSocket, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));
    
    if (result == 0) {
        NSLog(@"连接成功");
    }else {
        NSLog(@"连接失败");
    }
    //3. 向服务器发送数据
    /**
     第一个参数 socket
     第二个参数 要发送的数据
     第三个参数 要发送数据的长度
     第四个参数 标识, 一半填0 表明阻塞
     返回值：发送数据的长度
     */
    char *msg = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n";
    ssize_t sendSize =  send(clientSocket, msg, strlen(msg), 0);
    
    //4. 接收数据
    /**
     第一个参数 Socket
     第二个参数 接收数据的缓存区域
     第三个参数 缓存区域的长度
     第三个参数 是否阻塞, 一般填 0
     返回值: 接收数据的长度
     */
    uint8_t buffer[1024*8];
    ssize_t recvSize = recv(clientSocket, buffer, sizeof(buffer), 0);
    //把服务器返回的数据变成 NSString
    NSString *recvMsg = [[NSString alloc] initWithBytes:buffer length:recvSize encoding:NSUTF8StringEncoding];
    NSLog(@"%@",recvMsg);
    
    /*
     
     这里是我们访问的百度的服务器，给我们返回的数据，数据显示，我们用socket仿照HTTP的网络请求，被对方成功接收解析，并返回请求成功
     
     HTTP/1.1 200 OK
     Date: Wed, 28 Jun 2017 03:45:12 GMT
     Content-Type: text/html
     Content-Length: 14613
     Last-Modified: Thu, 22 Jun 2017 06:39:00 GMT
     Connection: Keep-Alive
     Vary: Accept-Encoding
     Set-Cookie: BAIDUID=92C804641C9D94C79729B1DAF525AF9D:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
     Set-Cookie: BIDUPSID=92C804641C9D94C79729B1DAF525AF9D; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
     Set-Cookie: PSTM=1498621512; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
     P3P: CP=" OTI DSP COR IVA OUR IND COM "
     Server: BWS/1.1
     X-UA-Compatible: IE=Edge,chrome=1
     Pragma: no-cache
     Cache-control: no-cache
     Accept-Ranges: bytes
     
     
     */
    //5. 关闭连接
    close(clientSocket);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
